﻿/**
 * @file PyFITKSEAShell.h
 * @brief  SEA板 为python装饰器接口准备的封装类
 * @author wangning (2185896382@qq.com)
 * @date 2024-12-03
 */
#ifndef __PY_SEA_SHELL_H___
#define __PY_SEA_SHELL_H___
 
#include "PyFITKAcousticsAbsModel.h"
#include <QString>
#include "FITKAbstractSEASubSysWithNodes.h"

namespace Acoustics
{
    class FITKAbstractSEASubSysShell;

    /**
     * @brief  SEA板 为python装饰器接口准备的封装类
     * @author wangning (2185896382@qq.com)
     * @date 2024-12-03
     */
    class FITKAcousticsModelAPI PyFITKSEAShell : public PyFITKAcousticsAbsodel
    {
    public:
        explicit PyFITKSEAShell(const QString& name);
        explicit PyFITKSEAShell() = default;
        virtual ~PyFITKSEAShell() = default;

        int getShellID();
        /**
         * @brief  添加点
         * @param[i]  pointId：点的ID
         * @param[i]  type：点的类型
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool addPoint(int pointId, int pointType);
        /**
         * @brief  获取名称
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        QString getName();
        /**
         * @brief  设置名称
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool setName(const QString& name);
        /**
         * @brief  创建平板
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool createPlate();
        /**
         * @brief  创建单曲率板
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool createSinglyCurvedShell();
        /**
         * @brief  创建双曲率板
         * @param[i]  numRing：双曲率板的层数
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool createDoublyCurvedShell(int numRing);
        /**
         * @brief 设置阻尼,只要调用该函数自动开启阻尼
         * @param[i]  type   1:flexure
                             2:extension
                             3:shear
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool setDamping(int type, const QString &damping);
        /**
         * @brief  禁用阻尼
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        void forbiddenDamping();
        /**
         * @brief  设置声学包
         * @param[i]  NCT：0内部声学包，1外部声学包
         * @param[i]  Covered：覆盖率
         * @param[i]  NCTtypeName：声学包种类
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool setNCT(int NCT, double Covered, const QString & NCTtypeName = QString());
        /**
         * @brief  设置物理属性
         * @param[i]  prop：物理属性
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool setPhysicalProp(const QString & prop);
        /**
         * @brief 设置有效辐射尺寸放大倍数
         * @param[i]  area：面积放大倍数
         * @param[i]  perimeter：周长放大倍数
         * @author wangning (2185896382@qq.com)
         * @date 2024-11-25
         */
        bool setEffRadiationDimensions(double area, double perimeter);
        /**
         * @brief 设置是否启用 弯曲波，拉伸波，剪切波  在SEA的解决方案
         * @param[i]  type：波的类型 1:弯曲波 2:拉伸波 3:剪切波
         * @author wangning (2185896382@qq.com)
         * @date 2024-11-25
         */
        bool setSEAMatrixSolution(int type, bool isSolution);
        /**
         * @brief 设置是否启用 弯曲波，拉伸波，剪切波  的模态密度及启用类型
         * @param[i]  type：波的类型 1:弯曲波 2:拉伸波 3:剪切波
         * @param[i]  isModalDensity：是否启用波的模态密度
         * @param[i]  modalDensity：模态密度类型
         * @author wangning (2185896382@qq.com)
         * @date 2024-11-25
         */
        bool setModalDensity(int type, bool isModalDensity, QString modalDensity);
        /**
         * @brief 设置弯曲波对分层面板的校正状态
         * @param[i]  is：是否启用
         * @param[i]  length：长放大倍数
         * @param[i]  width：宽放大倍数
         * @author wangning (2185896382@qq.com)
         * @date 2024-11-25
         */
        bool setFlexureCorrectionSDP(bool is, double length, double width);
        /**
         * @brief 设置 From Noise Control Treatments Damping
         * @author wangning (2185896382@qq.com)
         * @date 2024-11-25
         */
        bool setDampingFromNCT(bool is);
        /**
         * @brief 获取周长和面积
         * @author wangning (2185896382@qq.com)
         * @date 2024-11-25
         */
        QString getGeometryProp();

    private:
        /**
         * @brief  生成并添加板
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        bool creatModel(Acoustics::FITKAbstractSEASubSysShell* shellData);
        /**
         * @brief  从管理器中获取新名称
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        QString ckeckNameFromMgr(QString name);

    private:
        /**
         * @brief  板的节点链表
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        QList<Acoustics::FITKAbstractSEASubSysWithNodes::SubSysNode> _points;
        /**
         * @brief  板对象
         * @author wangning (2185896382@qq.com)
         * @date   2024-11-24
         */
        Acoustics::FITKAbstractSEASubSysShell* _shellObject{};
    };
}


#endif
